home *** CD-ROM | disk | FTP | other *** search
- (*
- ---------------------
- SBSIM ERROR MESSAGES
- ---------------------
- *)
-
- type simerr = (SIMerr_NoErr, (* No error occured *)
- SIMerr_IsBusy, (* SBSIM currently in use *)
- SIMerr_BadDriver, (* Bad driver specified *)
- SIMerr_BadFunction, (* Bad function specified *)
- SIMerr_VoiceActive, (* A voice process is already active *)
- SIMerr_VMEMnoStart, (* Couldn't start CT-VOICE *)
- SIMerr_VDSKnoStart, (* Couldn't start CTVDSK *)
- SIMerr_BadSIMhandle, (* Invalid SBSIM handle *)
- SIMerr_BadBuffer, (* Buffer not initialized yet *)
- SIMerr_BadFile, (* Bad file name given *)
- SIMerr_BadFileHandle, (* Bad file handle *)
- SIMerr_NotInited, (* Driver not started yet *)
- SIMerr_NoXMS, (* XMS driver not installed *)
- SIMerr_NoSIMfree, (* No free SBSIM handles *)
- SIMerr_BadFileType, (* Bad file type specified *)
- SIMerr_BadFreeXMS, (* Couldn't free XMS block *)
- SIMerr_AuxBadSource, (* Invalid source selected *)
- SIMerr_BadPanGet, (* Get pan position failed *)
- SIMerr_BadPanSet, (* Set pan position failed *)
- SIMerr_BadVolSet, (* Set volume failed *)
- SIMerr_FPbadStart, (* Couldn't start fade/pan *)
- SIMerr_FPbadStop, (* Couldn't stop fade/pan *)
- SIMerr_FPbadPause, (* Couldn't pause fade/pan *)
- SIMerr_FPbadType, (* Not a fade/pan operation *)
- SIMerr_FPbadMode, (* Bad mode for fade/pan *)
- SIMerr_FPfailed, (* Couldn't start fade/pan *)
- SIMerr_FPnotFadePan, (* Source not fading/panning *)
- SIMerr_MusicActive, (* FM or MIDI already playing *)
- SIMerr_BadMapper (* Bad MIDI mapper format *)
- );
-
-
- (*
- --------------
- ENUMERATIONS
- --------------
- *)
-
- type drivertype = (FM, DskVoice, MemVoice, AuxDrv, Midi);
-
- type sourcetype = (MASTER, VOICE, SYNTH, CD, LINE, MIC);
-
- (* for DOS file functions *)
- type AccessType = (ReadAccess, WriteAccess, RdWrAccess);
-
-
- (*
- ------------------------
- STRUCTURE DEFINITIONS
- ------------------------
- *)
-
- type driverinfo = record (* driver information structure *)
- loaded: boolean;
- entry,
- bufLoc: pointer;
- bufSize: word;
- end;
-
-
- (*
- ------------------
- GLOBAL VARIABLES
- ------------------
- *)
-
- var SIMint:integer; (* Interrupt used to access SBSIM *)
-
-
-
- (*--- SBSIM error messages ------------------*)
-
- const errorMsg:array[SIMerr_NoErr .. SIMerr_BadMapper] of string[40] =
- ('',
- 'SBSIM currently in use',
- 'Bad driver specified',
- 'Bad function specified',
- 'Voice process is already active',
- 'Couldn''t start CT-VOICE',
- 'Couldn''t start CTVDSK',
- 'Invalid SBSIM handle',
- 'Buffer not initialized yet',
- 'Bad file name for load',
- 'Bad file handle',
- 'Driver not started yet',
- 'XMS driver not installed',
- 'No free SBSIM handles',
- 'Bad file type specified',
- 'Couldn''t free XMS block',
- 'Invalid source selected',
- 'Get-Pan-Position failed',
- 'Set-Pan-Position failed',
- 'Set-Volume failed',
- 'Couldn''t start fade/pan',
- 'Couldn''t stop fade/pan',
- 'Couldn''t pause fade/pan',
- 'Not a fade/pan operation',
- 'Bad mode for fade/pan',
- 'Couldn''t start fade/pan',
- 'Source not fading/panning',
- 'FM or MIDI already playing',
- 'Bad MIDI mapper format');
-
-
- (************ I added these functions ******************)
-
- (*************************************************************************
- *
- * FUNCTION: AsciiZ - Given a Turbo Pascal string, this function returns a
- * pointer to a C type of string. The original string
- * should have enough storage space to append a chr(0) to
- * the end.
- * Inputs: str - a Turbo Pascal type of string.
- *
- * Output: a pointer to a null-terminated character array.
- *
- *************************************************************************)
- function AsciiZ(var str:string):pointer;
-
- begin
- if str[length(str)] <> chr(0)
- then str := str + chr(0); (* add null terminator *)
-
- (* first byte of string is length byte, so move pointer past it *)
- AsciiZ := ptr(seg(str), ofs(str)+1); (* return pointer to first character *)
- end;
-
-
-
- (*************************************************************************
- *
- * FUNCTION: DosOpen - Calls DOS to open a file.
- *
- * Inputs: fname - a Turbo Pascal type of string
- * mode - a var of type AccessType; specifies whether the file is
- * to be opened for reading, writing, or both.
- * Output:
- * if successful : a file handle
- * if not successful: -1
- *
- *************************************************************************)
- function DosOpen(fname:string; mode:AccessType):integer;
-
- var regs:registers;
- ptr:pointer;
-
- begin
- ptr := AsciiZ(fname); (* need null-terminated string *)
-
- regs.ah := $3D; (* DOS function number *)
- regs.al := word(mode);
-
- regs.dx := ofs(ptr^); (* pointer to file name *)
- regs.ds := seg(ptr^);
-
- msdos(regs); (* call MS-DOS *)
-
- if (regs.flags and FCarry) <> 0
- then DosOpen := -1
- else DosOpen := regs.ax;
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: DosClose - Calls DOS to close a file.
- *
- * Inputs: fhandle - the handle of a file previously opened with DosOpen.
- *
- * Output: none
- *
- * Note : DOS does return an error number, which can be returned by this
- * function by removing the comment delimiters from the last line.
- *
- *************************************************************************)
- procedure DosClose(fhandle:integer);
-
- var regs:registers;
-
- begin
- regs.ah := $3E; (* DOS function number *)
- regs.bx := word(fhandle);
- msdos(regs);
- (* DosClose := regs.ax; put this in if you want a function *)
- end;
-
-
-
-
- (*************************************************************************
- *
- * FUNCTION: FINDDVR - Searches for the requested driver's interrupt number
- * by looking for IDStr (in this case it will be
- * SBSIM) in the interrupt vector table memory at the
- * offset (as in SEGMENT:OFFSET) location passed to
- * this function.
- *
- * Inputs: IDStr - driver ID string (i.e. "SBSIM").
- * IDOff - driver's ID offset.
- *
- * Output: interrupt number or 0 (error condition) if not found.
- *
- *************************************************************************)
- function FindDvr(IDStr:string; IDOff:word):word;
-
- var dvrInt:word;
- intFound:boolean;
- dvrVec:pointer;
- i:integer;
-
- begin
- dvrInt := $80;
- repeat
- getintvec(dvrInt, dvrVec);
- intFound:=true;
- i:=1;
- while (i<=length(IDStr)) and intFound do
- begin
- if char(mem[seg(dvrVec^):IDOff+i-1]) <> IDStr[i]
- then intFound:=false;
- inc(i);
- end;
- inc(dvrInt);
- until (dvrInt > $C0) or (intFound = true);
-
- if intFound = true
- then FindDvr := dvrInt-1
- else FindDvr := 0;
-
- end;
-
-
-
- (*************************************************************************
- *
- * FUNCTION: VERSION - Get the current version of SBSIM.
- *
- * Inputs: none
- *
- * Output: version = high byte, sub-version = low byte.
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function Version:word;
-
- var regs:registers;
-
- begin
- regs.bh := 0; (* control function *)
- regs.bl := 0; (* query version sub-fn *)
- intr(SIMint, regs);
- Version := regs.ax; (* return version number *)
- end;
-
-
-
- (*************************************************************************
- *
- * FUNCTION: GETDRVRS - Determines which drivers are loaded.
- *
- * Inputs: none
- *
- * Output: bit field indicating which drivers are loaded.
- *
- * bit 0 - FM driver
- * bit 1 - Double disk buffered voice driver
- * bit 2 - Memory voice driver
- * bit 3 - Auxiliary driver (mixer)
- * bit 4 - MIDI driver
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function GetDrvrs:word;
-
- var regs:registers;
-
- begin
- regs.bh := 0; (* control function *)
- regs.bl := 1; (* query drivers sub-fn *)
- intr(SIMint, regs);
- GetDrvrs := regs.ax; (* return driver bit field *)
- end;
-
-
-
- (*************************************************************************
- *
- * FUNCTION: GETADDRESS - Returns selected driver's entry address.
- *
- * Inputs: driver 0 - FM driver
- * 1 - Double disk buffered voice driver
- * 2 - Memory voice driver
- * 3 - Auxiliary driver (mixer)
- * 4 - MIDI driver
- * address - storage for entry address pointer
- *
- * Output: 0 if no error.
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function GetAddress(driver:drivertype; var address:pointer):simerr;
-
- var regs:registers;
-
- begin
- regs.bh := 0; (* control function *)
- regs.bl := 2; (* driver entry address sub-fn *)
- regs.ax := word(driver);
- intr(SIMint, regs);
- address := ptr(regs.dx, regs.ax); (* return address *)
-
- if (regs.flags and FCarry)=0 (* test for errors *)
- then GetAddress:=simerr(0) (* return result *)
- else GetAddress:=simerr(regs.ax); (* error occured *)
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: GETBUFINFO - Returns selected driver's buffer address.
- *
- * Inputs: driver 0 - FM driver
- * 1 - Double disk buffered voice driver
- * 4 - MIDI driver
- * address - variable in which address of buffer will be stored.
- * size - variable in which size of buffer (in Kbytes) will be
- * stored.
- *
- * Output: 0 if no error
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function GetBufInfo(driver:drivertype; var address:pointer; var size:word):simerr;
-
- var regs:registers;
-
- begin
- regs.bh := 0; (* control function *)
- regs.bl := 5; (* driver entry address sub-fn *)
- regs.ax := word(driver);
- intr(SIMint, regs);
- address := ptr(regs.dx, regs.ax); (* return address *)
- size := regs.cx; (* return buffer size *)
-
- if (regs.flags and FCarry)=0 (* test for errors *)
- then GetBufInfo:=simerr(0) (* No error *)
- else GetBufInfo:=simerr(regs.ax); (* error occured *)
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: STARTSND - Initializes the driver for output.
- *
- * Inputs: driver: 0 - FM driver
- * 1 - Double disk buffered voice driver
- * 2 - Memory voice driver
- * 4 - MIDI driver
- *
- * ptr: pointer to filename or memory location.
- *
- * ExtMemVoc:
- * true - if the file is a .VOC file to be
- * played from extended memory.
- * false - Anything except a .VOC file from extended memory
- *
- * Output: Initialization result
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function StartSnd(driver:drivertype; ptr:pointer; ExtMemVoc:boolean;
- SBSIMHandle:integer):simerr;
-
- var regs:registers;
-
- begin
- regs.bh := word(driver) + 1;
- regs.bl := 0; (* start sound source function *)
- regs.cx := 0;
-
- if (ExtMemVoc)
- then begin (* extended memory voc file *)
- regs.ax := SBSIMHandle;
- regs.dx := 0;
- end
- else if driver=MemVoice
- then begin (* conventional memory .voc file *)
- regs.ax := ofs(ptr^); (* pointer to data buffer *)
- regs.dx := seg(ptr^);
- end
- else begin (* FM, MIDI, or DskVoice *)
- regs.ax := ofs(ptr^); (* pointer to filename *)
- regs.ds := seg(ptr^);
- end;
-
- intr(SIMint, regs);
-
- StartSnd := simerr(regs.ax); (* return initialization result *)
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: GETSNDSTAT - Get the driver's status.
- *
- * Inputs: driver 0 - FM driver
- * 1 - Double disk buffered voice driver
- * 2 - Memory voice driver
- * 4 - MIDI driver
- *
- * Output: Current status
- *
- * note: requires SIMint be defined before calling.
- *
- * RETURNS: -1 (negative one) if still playing
- * 0 (zero) if done playing
- *
- *************************************************************************)
- function GetSndStat(driver:drivertype):word;
-
- var regs:registers;
-
- begin
- regs.bh := word(driver) + 1;
- regs.bl := 5; (* get sound status function *)
- regs.cx := 0;
- intr(SIMint, regs);
- GetSndStat := regs.ax; (* return status *)
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: PLAYSND - Plays music/voice on the selected driver.
- *
- * Inputs: driver 0 - FM driver
- * 1 - Double disk buffered voice driver
- * 2 - Memory voice driver
- * 4 - MIDI driver
- *
- * Output: Result
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function PlaySnd(driver:drivertype):simerr;
-
- var regs:registers;
-
- begin
- regs.bh := word(driver) + 1;
- regs.bl := 1; (* play sound function *)
- regs.cx := 0;
- intr(SIMint, regs);
- PlaySnd := simerr(regs.ax); (* return result *)
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: STOPSND - Stops music/voice on the selected driver.
- *
- * Inputs: driver 0 - FM driver
- * 1 - Double disk buffered voice driver
- * 2 - Memory voice driver
- * 4 - MIDI driver
- *
- * Output: none
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- procedure StopSnd(driver:drivertype);
-
- var regs:registers;
-
- begin
- regs.bh := word(driver) + 1;
- regs.bl := 2; (* stop sound function *)
- regs.cx := 0;
- intr(SIMint, regs);
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: PAUSESND - Pauses music/voice on the selected driver.
- *
- * Inputs: driver 0 - FM driver
- * 1 - Double disk buffered voice driver
- * 2 - Memory voice driver
- * 4 - MIDI driver
- *
- * Output: None
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- procedure PauseSnd(driver:drivertype);
-
- var regs:registers;
-
- begin
- regs.bh := word(driver) + 1;
- regs.bl := 3; (* pause sound function *)
- regs.cx := 0;
- intr(SIMint, regs);
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: RESUMESND - Continues paused music/voice.
- *
- * Inputs: driver 0 - FM driver
- * 1 - Double disk buffered voice driver
- * 2 - Memory voice driver
- * 4 - MIDI driver
- *
- * Output: none
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- procedure ResumeSnd(driver:drivertype);
-
- var regs:registers;
-
- begin
- regs.bh := word(driver) + 1;
- regs.bl := 4; (* resume sound function *)
- regs.cx := 0;
- intr(SIMint, regs);
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: GETVOLUME - Get the source's volume.
- *
- * Inputs: source 0 - Master volume
- * 1 - Voice volume
- * 2 - MIDI volume
- * 3 - CD volume
- * 4 - Line-in volume
- * 5 - Microphone volume
- * volume - source's volume returned in this variable
- *
- * Output: 0 if no error
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function GetVolume(source:sourcetype; var volume:word):simerr;
-
- var regs:registers;
-
- begin
- regs.ax := word(source);
- regs.bh := 4; (* auxilary function *)
- regs.bl := 0; (* get source volume sub-function *)
- intr(SIMint, regs);
- volume := regs.ax; (* return volume *)
-
- if (regs.flags and FCarry)=0 (* test for errors *)
- then GetVolume:=simerr(0) (* No error *)
- else GetVolume:=simerr(regs.ax); (* error occured *)
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: SETVOLUME - Set the source's volume.
- *
- * Inputs: source 0 - Master volume
- * 1 - Voice volume
- * 2 - FM volume
- * 3 - CD volume
- * 4 - Line-in volume
- * 5 - Microphone volume
- * volume - source's new volume
- *
- * Output: 0 if no error
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function SetVolume(source:sourcetype; volume:word):simerr;
-
- var regs:registers;
-
- begin
- regs.bh := 4; (* auxilary function *)
- regs.bl := 1; (* set source volume sub-function *)
- regs.ax := word(source);
- regs.dx := volume;
- intr(SIMint, regs);
- SetVolume:=simerr(regs.ax);
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: GETGAIN - Get the SB16's gain.
- *
- * Inputs: direction 0 - input gain
- * 1 - output gain
- * level - the gain is returned in this variable
- * MSB = left
- * LSB = right
- *
- * Output: 0 if no error
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function GetGain(direction:integer; var level:word):simerr;
-
- var regs:registers;
-
- begin
- regs.ax := word(direction); (* 0=input gain, 1=output gain *)
- regs.bh := 4; (* auxilary function *)
- regs.bl := 2; (* get gain sub-function *)
- intr(SIMint, regs);
- level:= regs.ax; (* return volume *)
-
- if (regs.flags and FCarry)=0 (* test for errors *)
- then GetGain:=simerr(0) (* No error *)
- else GetGain:=simerr(regs.ax); (* error occured *)
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: SETGAIN - Set the SB16's gain.
- *
- * Inputs: direction 0 - input gain
- * 1 - output gain
- * level - new gain value
- * MSB = left
- * LSB = right
- *
- * Output: 0 if no error
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function SetGain(dir:integer; level:word):simerr;
-
- var regs:registers;
-
- begin
- regs.bh := 4; (* auxilary function *)
- regs.bl := 3; (* set gain sub-function *)
- regs.ax := word(direction);
- regs.dx := level;
- intr(SIMint, regs);
-
- if (regs.flags and FCarry)=0 (* test for errors *)
- then SetGain:=simerr(0) (* No error *)
- else SetGain:=simerr(regs.ax); (* error occured *)
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: GETTONE- Get the SB16's tone.
- *
- * Inputs: band 0 - Treble
- * 1 - Bass
- * level - the treble or bass tone is returned in this variable
- *
- * Output: 0 if no error
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function GetTone(band:integer; var level:word):simerr;
-
- var regs:registers;
-
- begin
- regs.ax := word(band);
- regs.bh := 4; (* auxilary function *)
- regs.bl := 4; (* get tone sub-function *)
- intr(SIMint, regs);
- level:= regs.ax; (* return volume *)
-
- if (regs.flags and FCarry)=0 (* test for errors *)
- then GetTone:=simerr(0) (* No error *)
- else GetTone:=simerr(regs.ax); (* error occured *)
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: SETTONE - Set the SB16's tone.
- *
- * Inputs: band 0 - Treble
- * 1 - Bass
- * level - new treble or bass tone
- *
- * Output: 0 if no error
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function SetTone(band:integer; level:word):simerr;
-
- var regs:registers;
-
- begin
- regs.bh := 4; (* auxilary function *)
- regs.bl := 5; (* set tone sub-function *)
- regs.ax := word(band);
- regs.dx := level;
- intr(SIMint, regs);
-
- if (regs.flags and FCarry)=0 (* test for errors *)
- then SetTone:=simerr(0) (* No error *)
- else SetTone:=simerr(regs.ax); (* error occured *)
- end;
-
-
- (*************************************************************************
- *
- *
- * FUNCTION: LoadExtMem() - Load a .VOC file into extended memory.
- *
- * Inputs: Ptr - pointer to null-terminated string that string that contains
- * the filename to be loaded into extended memory.
- * (Example: C:\VOICE\TEST.VOC)
- * retval - SBSIM handle will be returned in this variable.
- * Output:
- * if successful - returns true, and SBSIM handle is in retval
- * if not - returns false.
- *
- *************************************************************************)
- function LoadExtMem(Ptr:pointer; var retval:integer):boolean;
-
- var regs:registers;
-
- begin
- regs.dx := ofs(Ptr^);
- regs.ds := seg(Ptr^);
-
- regs.bh := 0;
- regs.bl := 16;
- regs.ax := 0;
- regs.cx := 0; (* Have driver assign you a handle (returned in AX) *)
- intr(SIMint, regs);
-
- if (regs.flags and FCarry) <> 0 (* an error has occurred *)
- then LoadExtMem := false
- else LoadExtMem := true;
-
- retval := integer(regs.ax); (* return extended mem. handle, or error code *)
- end;
-
-
- (*************************************************************************
- *
- *
- * FUNCTION: FreeExtMem() - Releases the memory in extended memory.
- *
- * DESCRIPTION: Pass the SBSIMHandle obtained by LoadExtMem() to this
- * function. The extended memory used by the LoadExtMem()
- * will then be freed.
- *
- * RETURNS: 0 - (zero) if there are NO errors. Otherwise a SIMERR type
- * will be returned.
- *
- *************************************************************************)
- function FreeExtMem(SBSIMHandle:integer):simerr;
-
- var regs:registers;
-
- begin
- regs.bh := 0;
- regs.bl := 19;
- regs.ax := SBSIMHandle;
- intr(SIMint, regs);
-
- FreeExtMem := simerr(regs.ax); (* return result *)
- end;
-
-
- (*************************************************************************
- *
- * FUNCTION: GETDVRINFO - Get status, entry point, buffer location, and
- * buffer size from SBSIM. The DVRINFO struct gets
- * loaded with this information
- *
- * Inputs: driver - driver to get info on.
- * *dvrInfo - pointer to DVRINFO structure.
- *
- * Output: status - the driver's status.
- *
- * note: requires SIMint be defined before calling.
- *
- *************************************************************************)
- function GetDvrInfo(driver:drivertype; var dvrInfo:driverinfo):boolean;
-
- var dvrLoc:integer;
- dummy:simerr;
-
- begin
- dvrLoc := 1 shl word(driver);
- if (GetDrvrs and dvrLoc) = dvrLoc
- then begin
- dvrInfo.loaded := true;
- dummy := GetAddress(driver, dvrInfo.entry); (* discard results *)
- if (GetBufInfo(driver, dvrInfo.bufLoc, dvrInfo.bufSize) <> SIMerr_NoErr)
- then begin
- dvrInfo.bufLoc := nil;
- dvrInfo.bufSize := 0;
- end;
- end
- else
- dvrInfo.loaded := false;
-
- GetDvrInfo := dvrInfo.loaded;
- end;
-
-